//
//  main.c
//  数组与函数
//
//  Created by ws on 2017/7/20.
//  Copyright © 2017年 王松. All rights reserved.
//

#include <stdio.h>
/**
 1.数组是什么类型,那么他的元素就是什么类型的值
 2.基本数据类型作为函数参数传递的时候是值传递
 3.数组作为函数参数传递的时候是地址传递(因为数组名称本身就是一个地址,所以他传递的是地址)
 */
void printNum(int num){
    printf("%d\n",num);
}

/**
 数组是什么类型,那么他的元素就是什么类型的值
 基本数据类型作为函数参数传递的时候是值传递
 数组作为函数参数传递的时候是地址传递(因为数组名称本身就是一个地址,所以他传递的是地址),如果在函数中改变某个数组元素的值,那么原来(实参)数组中的值也会改变
 */
void test0(){
    int nums[] = {1,2,3,4,5};
    for (int i = 0; i < sizeof(nums)/sizeof(int); i++) {
        printf("%d\n",nums[i]);
    }
}
/**
 改变数组里面某个元素的值
 */
void changeArrayElementValue(int array[] ,int index){
    array[index] = 10;
    printf("%d\n",array[index]);
    
}
/**
 交换数组里两个元素的值
 */
void exchangeElementValue(int array[] ,int index1 ,int index2){
    int temp= array[index1];
    array[index1] = array[index2];
    array[index2] = temp;
    
}
/**
 打印数组
 指针:是用来存放地址的变量,指针占用了8个字节的存储空间
 当数组作为函数参数传递的时候,会被自动转化为指针类型,传递的是指针地址,所以只有八个字节,实参数组元素个数,在函数里面形参数组是打印不出来的
 
 总结:
 1.数组元素作为函数传递是值传递,和普通变量是一样的
 2.数组作为函数参数传递是地址传递,如果改变形参数组里的某个元素,那么就会影响实参数组中该元素的值
 3.数组作为函数参数传递会被自动转化为指针类型,所以在函数中不能够获取形参数组的长度,只能由主调函数传入
 */
void printArray(int array[],int count){
    printf("[");
//    printf("== %lu",sizeof(array));
    for (int i = 0; i < count; i++) {
        //打印数字
        printf("%d",array[i]);
        //打印逗号
        if (i != count - 1) {
            printf(",");
        }
    }
    printf("]\n");
}
int main(int argc, const char * argv[]) {
//    //交换数组元素的值
    int nums[] = {1,2,3,4,5};
    printf("== %lu\n",sizeof(nums));
//    changeArrayElementValue(nums, 1);
//        printf("%d\n",nums[1]);
//    exchangeElementValue(nums, 0, 2);
//    printf("%d %d",nums[0],nums[2]);
    printArray(nums,sizeof(nums)/sizeof(int));
    return 0;
}
